home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 26 / Cream of the Crop 26.iso / program / ddj0897.zip / DYN401.ZIP / class / date.c < prev    next >
C/C++ Source or Header  |  1997-04-16  |  10KB  |  540 lines

  1.  
  2.  
  3. /*  Copyright (c) 1993-1996 Algorithms Corporation  */
  4. /*  All rights reserved.  */
  5.  
  6.  
  7.  
  8.  
  9. /*  This file automatically generated by dpp - do not edit  */
  10.  
  11. #define    DPP_STRATEGY    2
  12. #define    DPP_FASTWIDE    0
  13.  
  14.  
  15.  
  16. #line 15 "date.d"
  17. #include <string.h> 
  18. #include <math.h> 
  19. #include <time.h> 
  20.  
  21. #define    CLASS    Date_c
  22. #define    ivType    Date_iv_t
  23.  
  24. #include "generics.h"
  25.  
  26. object    Date_c;
  27.  
  28.  
  29. #line 26 "date.d"
  30. static gLongValue_t longValue; 
  31. static gChangeLongValue_t changeLongValue; 
  32.  
  33.  
  34. static char *Dtfmt(long d, char *s) 
  35.     int i; 
  36.     char v[7]; 
  37.  
  38.     s[8] = '\0'; 
  39.  
  40. #line 44 "date.d"
  41.     if (d < 101L) { 
  42.         for (i=0 ; i != 8 ; ) 
  43.             s[i++] = ' '; 
  44.         return(s); 
  45.     } 
  46.     d %= 1000000L; 
  47.     sprintf(v, "%6ld", d); 
  48.     s[0] = v[2] == '0' ? ' ' : v[2]; 
  49.     s[1] = v[3]; 
  50.     s[2] = '/'; 
  51.     s[3] = v[4]; 
  52.     s[4] = v[5]; 
  53.     s[5] = '/'; 
  54.     s[6] = v[0] == ' ' ? '0' : v[0]; 
  55.     s[7] = v[1] == ' ' ? '0' : v[1]; 
  56.     return(s); 
  57.  
  58. #if 0 
  59.  
  60. static char *Dtfmt4(long d, char *s) 
  61.     int i; 
  62.     char v[9]; 
  63.  
  64.     if (d <= 0L || d > 99991231L) { 
  65.         for (i=0 ; i != 10 ; ) 
  66.             s[i++] = ' '; 
  67.         s[i] = '\0'; 
  68.         return(s); 
  69.     } 
  70.     sprintf(v, "%8ld", d); 
  71.     s[0] = (v[4] == '0') ? ' ' : v[4]; 
  72.     s[1] = v[5]; 
  73.     s[2] = '/'; 
  74.     s[3] = v[6]; 
  75.     s[4] = v[7]; 
  76.     s[5] = '/'; 
  77.     s[6] = v[0]; 
  78.     s[7] = v[1]; 
  79.     s[8] = v[2]; 
  80.     s[9] = v[3]; 
  81.     s[10] = '\0'; 
  82.     return(s); 
  83.  
  84. #endif 
  85.  
  86. static long Jul(long x) 
  87.     long d, y; 
  88.     long m; 
  89.  
  90.     if (x <= 0L) return(x); 
  91.     y = x / 10000L; 
  92.     m = (x % 10000L) / 100L; 
  93.     d = x % 100L; 
  94.     d += (long) (.5 + (m - 1L) * 30.57); 
  95.     if (m > 2L) { 
  96.         d--; 
  97.  
  98.  
  99.  
  100.  
  101.         if (0L != y % 400L && 0L != y % 4L) 
  102.             d--; 
  103.         else if (0L != y % 400L && 0L == y % 100L) 
  104.             d--; 
  105.     } 
  106.     d += (long) (365.25 * --y); 
  107.     d += y / 400L; 
  108.     d -= y / 100L; 
  109.     return(d); 
  110.  
  111. static long Cal(long d) 
  112.     long y, m, t; 
  113.  
  114.     if (d <= 0L) return(d); 
  115.     y = (long)(1.0 + d / 365.2425); 
  116.     t = y - 1L; 
  117.     d -= (long) (t * 365.25); 
  118.     d -= t / 400L; 
  119.     d += t / 100L; 
  120.     if (d > 59L && 0L != y % 400L && (0L != y % 4 || 0L == y % 100L)) 
  121.         d++; 
  122.     if (d > 60L) 
  123.         d++; 
  124.     m = (long)((d + 30L) / 30.57); 
  125.     d -= (long) floor(.5 + (m - 1L) * 30.57); 
  126.     if (m == 13) { 
  127.         m = 1; 
  128.         ++y; 
  129.     } else if (!m) { 
  130.         m = 12; 
  131.         --y; 
  132.     } 
  133.     return 10000L * y + m * 100L + d; 
  134.  
  135. static char *Dyofwk(long d, char *s) 
  136.     int i; 
  137.     char *p; 
  138.  
  139.     if (d <= 0L) 
  140.         if (s) { 
  141.         *s = '\0'; 
  142.         return(s); 
  143.     } else 
  144.         return(""); 
  145.     i = Jul(d) % 7L; 
  146.     switch (i) { 
  147.         case 0: p = "Sunday"; break; 
  148.         case 1: p = "Monday"; break; 
  149.         case 2: p = "Tuesday"; break; 
  150.         case 3: p = "Wednesday"; break; 
  151.         case 4: p = "Thursday"; break; 
  152.         case 5: p = "Friday"; break; 
  153.         case 6: p = "Saturday"; break; 
  154.         default: p = ""; break; 
  155.     } 
  156.     if (s) { 
  157.         strcpy(s, p); 
  158.         return(s); 
  159.     } else 
  160.         return(p); 
  161.  
  162. static char *Mmofyr(int m, char *s) 
  163.     char *p; 
  164.  
  165.     if (m <= 0) 
  166.         if (s) { 
  167.         *s = '\0'; 
  168.         return(s); 
  169.     } else 
  170.         return(""); 
  171.     m = (m - 1) % 12; 
  172.     switch (m) { 
  173.         case 0: p = "January"; break; 
  174.         case 1: p = "February"; break; 
  175.         case 2: p = "March"; break; 
  176.         case 3: p = "April"; break; 
  177.         case 4: p = "May"; break; 
  178.         case 5: p = "June"; break; 
  179.         case 6: p = "July"; break; 
  180.         case 7: p = "August"; break; 
  181.         case 8: p = "September"; break; 
  182.         case 9: p = "October"; break; 
  183.         case 10: p = "November"; break; 
  184.         case 11: p = "December"; break; 
  185.         default: p = ""; break; 
  186.     } 
  187.     if (s) { 
  188.         strcpy(s, p); 
  189.         return(s); 
  190.     } else 
  191.         return(p); 
  192.  
  193. static short *Timemark(short int *v) 
  194.     struct tm *a; 
  195.  
  196.  
  197.  
  198.  
  199.     time_t t; 
  200.  
  201.     time(&t); 
  202.     a = localtime(&t); 
  203.     v[0] = a->tm_year + 1900; 
  204.     v[1] = a->tm_mon + 1; 
  205.     v[2] = a->tm_mday; 
  206.     v[3] = a->tm_hour; 
  207.     v[4] = a->tm_min; 
  208.     v[5] = a->tm_sec; 
  209.     v[6] = 0; 
  210.     return v; 
  211.  
  212. static long _Today(void) 
  213.     short v[7]; 
  214.  
  215.     Timemark(v); 
  216.     return 10000L * (long) v[0] + 100L * (long) v[1] + (long) v[2]; 
  217.  
  218. static long Date_ymd(long date, int *year, int *month, int *day) 
  219.     register int temp; 
  220.  
  221.     temp = (int) (date % 10000L); 
  222.  
  223.     if (year) *year = (int) (date / 10000L); 
  224.     if (month) *month = temp / 100; 
  225.     if (day) *day = temp % 100; 
  226.     return(date); 
  227.  
  228. static long Ymd_date(int year, int month, int day) 
  229.     return((long) year * 10000L + (long) month * 100L + (long) day); 
  230.  
  231. static char *Num_sufx(int d) 
  232.     register int i = d % 10; 
  233.  
  234.     if (i == 1 && d != 11) 
  235.         return "st"; 
  236.     else if (i == 2 && d != 12) 
  237.         return "nd"; 
  238.     else if (i == 3 && d != 13) 
  239.         return "rd"; 
  240.     else return "th"; 
  241.  
  242. static char *Time2(char *buf) 
  243.     short v[7], t=0; 
  244.  
  245.     Timemark(v); 
  246.     if (v[3] >= 12) { 
  247.         t = 1; 
  248.         if (v[3] > 12) v[3] -= 12; 
  249.     } 
  250.     sprintf(buf, "%2d:%2d %s", 
  251.         (int) v[3], (int) v[4], t ? "PM" : "AM"); 
  252.     if (buf[3] == ' ') 
  253.         buf[3] = '0'; 
  254.     return(buf); 
  255.  
  256. static char *DateFmt(char *buf, long dt, char *msk) 
  257.     int y, m, d; 
  258.     char tmp[20], *bp = buf; 
  259.  
  260.     if (dt <= 0L) { 
  261.         *buf = '\0'; 
  262.         return(buf); 
  263.     } 
  264.     Date_ymd(dt, &y, &m, &d); 
  265.     while (*msk) 
  266.         if (*msk != '%') 
  267.         *bp++ = *msk++; 
  268.     else 
  269.         switch (*++msk) { 
  270.         case '\0': 
  271.         break; 
  272.         case '%': 
  273.         default: 
  274.         *bp++ = *msk++; 
  275.         break; 
  276.         case 'W': 
  277.         case 'w': 
  278.         strcpy(bp, Dyofwk(dt, NULL)); 
  279.         bp += strlen(bp); 
  280.         msk++; 
  281.         break; 
  282.         case 'M': 
  283.         strcpy(bp, Mmofyr(m, NULL)); 
  284.         bp += strlen(bp); 
  285.         msk++; 
  286.         break; 
  287.         case 'm': 
  288.         strcpy(bp, Mmofyr(m, NULL)); 
  289.         bp += 3; 
  290.         msk++; 
  291.         break; 
  292.         case 'd': 
  293.         sprintf(bp, "%d", d); 
  294.         bp += strlen(bp); 
  295.         msk++; 
  296.         break; 
  297.         case 'D': 
  298.         sprintf(bp, "%2d", d); 
  299.         for ( ; *bp ; ++bp) 
  300.             if (*bp == ' ') 
  301.             *bp = '0'; 
  302.         msk++; 
  303.         break; 
  304.         case 'y': 
  305.         sprintf(bp, "%2d", y%100); 
  306.         for ( ; *bp ; ++bp) 
  307.             if (*bp == ' ') 
  308.             *bp = '0'; 
  309.         msk++; 
  310.         break; 
  311.         case 'Y': 
  312.         sprintf(bp, "%4d", y); 
  313.         bp += strlen(bp); 
  314.         msk++; 
  315.         break; 
  316.         case 'S': 
  317.         case 's': 
  318.         strcpy(bp, Num_sufx(d)); 
  319.         bp += strlen(bp); 
  320.         msk++; 
  321.         break; 
  322.         case 'n': 
  323.         sprintf(bp, "%d", m); 
  324.         bp += strlen(bp); 
  325.         msk++; 
  326.         break; 
  327.         case 'N': 
  328.         sprintf(bp, "%2d", m); 
  329.         bp += strlen(bp); 
  330.         msk++; 
  331.         break; 
  332.         case 'T': 
  333.         case 't': 
  334.         strcpy(bp, Time2(tmp)); 
  335.         bp += strlen(bp); 
  336.         msk++; 
  337.         break; 
  338.     } 
  339.     *bp = '\0'; 
  340.     return(buf); 
  341.  
  342. static long Add_days(long date, long days) 
  343.     if (date <= 0L) return(0L); 
  344.     return Cal(days + Jul(date)); 
  345.  
  346. static long Add_mon(long date, int months) 
  347.     int y, m, d; 
  348.     long mon; 
  349.  
  350.     if (date <= 0L) return(0L); 
  351.     Date_ymd(date, &y, &m, &d); 
  352.     mon = 12L * (long) y + (long) m + (long) months - 1L; 
  353.     y = mon / 12L; 
  354.     m = 1L + mon % 12L; 
  355.     date = Ymd_date(y, m, d); 
  356.     return(date); 
  357.  
  358. static long Add_year(long date, int years) 
  359.     int y, m, d; 
  360.  
  361.     if (date <= 0L) return(0L); 
  362.     Date_ymd(date, &y, &m, &d); 
  363.     y += years; 
  364.     date = Ymd_date(y, m, d); 
  365.     return(date); 
  366.  
  367. static int Valid_date(long d) 
  368.     return d == Cal(Jul(d)); 
  369.  
  370. static long Date_dif(long d1, long d2) 
  371.     return Jul(d1) - Jul(d2); 
  372.  
  373. imeth objrtn Date_im_gDayName(object self)
  374.     return gNewWithStr(String, Dyofwk(longValue(self), NULL)); 
  375.  
  376. imeth objrtn Date_im_gMonthName(object self)
  377.     int m; 
  378.     Date_ymd(longValue(self), NULL, &m, NULL); 
  379.     return gNewWithStr(String, Mmofyr(m, NULL)); 
  380.  
  381. imeth objrtn Date_im_gFormatDate(object self, char *msk)
  382.     char buf[80]; 
  383.  
  384.     return gNewWithStr(String, DateFmt(buf, longValue(self), msk)); 
  385.  
  386. imeth objrtn Date_im_gStringRepValue(object self)
  387.     char buf[15]; 
  388.  
  389.     return gNewWithStr(String, Dtfmt(gLongValue(self), buf)); 
  390.  
  391. cmeth objrtn Date_cm_gToday(object self)
  392.     return gNewWithLong(self, _Today()); 
  393.  
  394. imeth objrtn Date_im_gAddDays(object self, long days)
  395.     return changeLongValue(self, Add_days(longValue(self), days)); 
  396.  
  397. imeth objrtn Date_im_gAddMonths(object self, int months)
  398.     return changeLongValue(self, Add_mon(longValue(self), months)); 
  399.  
  400. imeth objrtn Date_im_gAddYears(object self, int years)
  401.     return changeLongValue(self, Add_year(longValue(self), years)); 
  402.  
  403. imeth int Date_im_gValidDate(object self)
  404.     return Valid_date(longValue(self)); 
  405.  
  406. imeth long Date_im_gDifference(object self, object dt)
  407.     ChkArgTyp(dt, 2, Date); 
  408.     return Date_dif(longValue(self), longValue(dt)); 
  409.  
  410. cmeth long Date_cm_gCalToJul(object self, long dt)
  411.     return Jul(dt); 
  412.  
  413. cmeth long Date_cm_gJulToCal(object self, long dt)
  414.     return Cal(dt); 
  415.  
  416. imeth long Date_im_gJulian(object self)
  417.     return Jul(longValue(self)); 
  418.  
  419. static void init_class(void) 
  420.     longValue = imcPointer(CLASS, gLongValue); 
  421.     changeLongValue = imcPointer(CLASS, gChangeLongValue); 
  422.  
  423. #line 488 "date.c"
  424.  
  425. objrtn    Date_initialize(void)
  426. {
  427.     static  CRITICALSECTION  cs;
  428.     static  int volatile once = 0;
  429.  
  430.     ENTERCRITICALSECTION(_CI_CS_);
  431.     if (!once) {
  432.         INITIALIZECRITICALSECTION(cs);
  433.         once = 1;
  434.     }
  435.     LEAVECRITICALSECTION(_CI_CS_);
  436.  
  437.     ENTERCRITICALSECTION(cs);
  438.  
  439.     if (Date_c) {
  440.         LEAVECRITICALSECTION(cs);
  441.         return Date_c;
  442.     }
  443.     INHIBIT_THREADER;
  444.     LongInteger_initialize();
  445.     if (Date_c)  {
  446.         ENABLE_THREADER;
  447.         LEAVECRITICALSECTION(cs);
  448.         return Date_c;
  449.     }
  450.     Date_c = gNewClass(Class, "Date", 0, 0, LongInteger, END);
  451.     cMethodFor(Date, gCalToJul, Date_cm_gCalToJul);
  452.     cMethodFor(Date, gToday, Date_cm_gToday);
  453.     cMethodFor(Date, gJulToCal, Date_cm_gJulToCal);
  454.     iMethodFor(Date, gJulian, Date_im_gJulian);
  455.     iMethodFor(Date, gAddYears, Date_im_gAddYears);
  456.     iMethodFor(Date, gMonthName, Date_im_gMonthName);
  457.     iMethodFor(Date, gDayName, Date_im_gDayName);
  458.     iMethodFor(Date, gFormatDate, Date_im_gFormatDate);
  459.     iMethodFor(Date, gAddMonths, Date_im_gAddMonths);
  460.     iMethodFor(Date, gDifference, Date_im_gDifference);
  461.     iMethodFor(Date, gAddDays, Date_im_gAddDays);
  462.     iMethodFor(Date, gStringRepValue, Date_im_gStringRepValue);
  463.     iMethodFor(Date, gValidDate, Date_im_gValidDate);
  464.  
  465.     init_class();
  466.  
  467.     ENABLE_THREADER;
  468.  
  469.     LEAVECRITICALSECTION(cs);
  470.  
  471.     return Date_c;
  472. }
  473.  
  474.  
  475.  
  476.